<?php
/**
 * 2017年3月16日
 */
class MY_Controller extends CI_Controller {

    function __construct(){
        parent::__construct();
        /*开启Session*/
        @session_start();
            // date_default_timezone_set('PRC');
            // 图片基础参数设置
            // 字符编码
        $this->load->helper('url');
        header ('Content-Type: text/html; charset=UTF-8');

        ini_set('memory_limit','256M');

        define('IS_GET', $_SERVER['REQUEST_METHOD'] == 'GET' ? true : false);
        define('IS_POST', $_SERVER['REQUEST_METHOD'] == 'POST' ? true : false);

        define('HW_JS',base_url().'static/js/');
        define('HW_CSS',base_url().'static/css/');
        define('HW_IMG',base_url().'static/img/');

        define('HW_AdminLTE',base_url().'static/admin-lte/');
    }

    function trans_rollback($msg = '操作失败')
    {
        $this->db->trans_rollback();
        return array('code'=>0,'msg'=>$msg);
    }

    function trans_commit($msg = '操作成功')
    {
        $this->db->trans_commit();
        return array('code'=>1,'msg'=>$msg);
    }

        /**
         * 获取编码
         * @param  [type] $str [description]
         * @return [type]      [description]
         */
        function get_code($str)
        {
            return $str.date('ymdhis', time()).rand(0, 9).rand(0, 9);
        }

        /**
         * 检验签名
         */
        function checkSignature($param){
            if(!isset($param['Uid'])||!isset($param['signature'])){
                return false;
            }else{
                if(strcmp($param['signature'], md5($param['Uid'].date('Ymd')))==0){
                    return true;
                }else{
                    return false;
                }
            }
        }
        /**
         * 自定义操作成功页面 默认跳转操作前一个页面
         * @return [type] [description]
         */
        function success($info='',$jumpUrl='',$waitsecond=1)
        {
            if($jumpUrl==''){
                $jumpUrl = $_SERVER["HTTP_REFERER"];
            }
            $data = array(
                'info'=>$info,
                'jumpUrl'=>$jumpUrl,
                'waitsecond'=>$waitsecond,
                'status'=>1,         //表示成功操作
                'firstloc'=>'操作结果',
                'secondloc'=>'操作成功',
            );
            $this->load->view('Public/message',$data);
        }
        /*
         * 自定义操作失败页面
         * @param  string  $info       [提示信息]
         * @param  [type]  $jumpUrl    [跳转地址]
         * @param  integer $waitsecond [等待时间]
         * @return [type]              [description]
         */
        function error($info='',$jumpUrl='',$waitsecond=2){
            if($jumpUrl==''){
                $jumpUrl = $_SERVER["HTTP_REFERER"];
            }
            $data = array(
                'info'=>$info,
                'jumpUrl'=>$jumpUrl,
                'waitsecond'=>$waitsecond,
                'status'=>0,        //表示失败操作
                'firstloc'=>'操作结果',
                'secondloc'=>'操作失败',
            );
            $this->load->view('Public/message',$data);
        }

        /**
         * [无权限页面跳转]
         * @AuthorHTL
         * @DateTime  2017-08-15T11:49:53+0800
         * @param     [type] $msg [权限跳转提示]
         */
        function autherror($msg = '您无权限进行该操作')
        {
            $data['msg'] = $msg;
            $this->load->view('Public/authority', $data);
        }

        /**
         * 处理操作结果
         * @param  [type] $result [description]
         * @return [type]         [description]
         */
        function handleResult($result,$url = ''){
            if($result['code']==1){
                $this->success($result['msg'],$url);
            }else{
                $this->error($result['msg'],$url);
            }
        }

        /**
         * 正则匹配要访问的访问需要控制的权限
         * @return [type] [description]
         */
        function matchMethod($func)
        {
            // 权限控制 获取要访问的方法名 并对该方法进行正则匹配
            if (preg_match('/List|list/', $func))
            {
                $method = 'select';    
            }
            else if (preg_match('/add|Add|Insert|insert/', $func))
            {
                $method = 'add';
            }
            else if (preg_match('/edit|Edit|update|change|Update|Change/', $func))
            {
                $method = 'edit';
            }
            else if (preg_match('/del|Del|delete|Delete|cancel|Cancel/', $func))
            {
                $method = 'del';
            }
            else
            {
                $method = '';
            }

            return $method;
        }

        /*
        权限验证
        $action[模块名] $method【具体请求的方法,只有3个值 add，edit，del，select，reviewed，all】 $usergroup【用户权限组，取表的usergroup字段】
        例如：用户编辑权限判断时如下调用：
        $this->authcheck('User','edit','23');
        2017.3.27 小黑鼠
        */
        function authcheck($action, $method, $usergroup=0){
            // return true;

            $this->load->model('AuthManager/Auth_model','auth');
            //若无权限列表则根据登陆用户session去取权限组的权限
            if(!isset($_SESSION['authgroup'])){
                $_SESSION['authgroup'] = $this->auth->getsessionauth($_SESSION['admin_info']['usergroup']);
            }
            //若无需检测的权限列表则加载该列表
            // unset($_SESSION['authlist']);
            if(!isset($_SESSION['authlist'])){
                $res = $this->auth->getsessionauthname($_SESSION['admin_info']['shop_token']);
                foreach ($res as $key => $value) {
                    $authlist[]=$value['authname'];
                }  
                $_SESSION['authlist']= $authlist;
            }


            if(!in_array($action, $_SESSION['authlist'])){
                return true;
            }
            //若请求的模块在用户所在权限组里，进行进一步判断
            if(in_array($action, array_keys($_SESSION['authgroup']))){
                if(in_array($method, $_SESSION['authgroup'][$action])){
                    return true;
                }else{
                    return false;
                }
            }else{
                return false;
            }
            
        }
    }

    /**
     * 管理员
     */
    class Admin_Controller extends MY_Controller
    {
        /**
         * 权限检查
         * @param  [type] $class [description]
         * @return [type]        [description]
         */
        // function auth_check($class)
        // {

        //         //获取用户权限
        //         // $authority = explode(',', $_SESSION['supplier_admin_info']['authority']);
        //         //  //判断用户是否有访问控制器的权限
        //         // if(!in_array($class, $authority)){
        //         //     return false;
        //         // }else{
        //         //     return true;
        //         // }
        // }
        function __construct()
        {
            parent::__construct();

            defined('LINES') OR define('LINES', '50');

            if (!isset($_SESSION['admin_info'])){

                if (Common::isAjax())
                {
                    echo json_encode(array('code'=>0,'msg'=>'您长时间未操作系统，请重新登录'));
                    exit();
                }
                else
                {
                    //跳转回商家管理员登入界面
                    echo "<script>window.alert('您的登录已失效， 请重新登录'); window.top.location.href = '".base_url()."Admin/Login/login';"."</script>";
                    exit();

                }
            }
        }
    }
    /**
     * 微信父类
     */
    class Weixin_Controller extends MY_Controller
    {

        function __construct()
        {
            parent::__construct();

            defined('LINES') OR define('LINES', '10');
        }

        /**
         * [签名验证]
         * @Author   zt
         * @DateTime 2018-08-06
         * @return   [type]     [description]
         */
        function checkSign(){
            $post = file_get_contents("php://input");
            $post = json_decode($post, true);

            if (empty($post)) {
                $res = array(
                    'code' => 0,
                    'msg' => '请求参数丢失',
                );
                
                echo json_encode($res);exit;
            }

            $post_sign = $post['sign'];
            unset($post['sign']);

            ksort($post);

            $str = '';
            foreach ($post as $key => $val) {
                if (!is_array($val) && $key != 'sign') {
                    $str .= $key.'='.$val.'&';
                }
            }
            $sign = md5($str.'key=seasound');

            if ($post_sign != $sign) {
                $res = array(
                    'code' => 0,
                    'msg' => '签名验证失败',
                );

                echo json_encode($res);exit;
            } else {
                $res = array(
                    'code' => 1,
                    'msg' => '签名验证成功',
                    'data' => $post,
                );

                return $res['data'];
            }
        }
    }